package SAToDA;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 *Esta classe contém todos os cursos oferecidos em um determinado catálogo
 *cujo ano é determinado na hora da criação de um objeto
 *A lista de cursos é armazenada no ArrayList de objetos da classe Curso
 * @author Grupo G2
 */

public class CatalogoDeArquivo {
    
    private String ano;
    private ArrayList<Curso> cursos;
    final static private Logger logger = LoggerFactory.getLogger(CatalogoDeArquivo.class);

    /**
     * Construtor da classe
     * @param ano Ano do catalogo escolhido
     * @throws FileNotFoundException Nao acha o arquivos do ano indicado vindo do metodo inicializarCatalogo
     * @throws IOException Erro de leitura vindo do metodo inicializarCatalogo
     * 
     */
    public CatalogoDeArquivo(int ano) throws FileNotFoundException, IOException{
        
        cursos = new ArrayList<Curso>();
        this.ano = String.valueOf(ano);
        this.inicializarCatalogo(this.ano);
    }
    
    /**
     *Este método utiliza o o atributo "nome" para construir a lista du cursos
     *do catalogo desejado a partir do arquivo <ANO>.txt, que contem todos os
     *cursos oferecidos no ano armazenado no atributo "nome"
     * @param ano Ano do catalogo escolhido
     * @see iniciarlizarCatalogo
     */
    private void inicializarCatalogo(String ano) throws FileNotFoundException, IOException{
        
        int i;
        int codigoDoCurso;
        String nomeDoCurso;
        String filePath;
        BufferedReader file;
        String aux;
        Curso curso;
        String error;
        
        //Aqui primeiro tenta-se abrir o arquivo utilizando o padrao de endereço
        //do Windows. Caso esta tentativa lance um IOException tenta-se utilizar o
        //padrao de endereço do
        filePath = "src\\SAToDA\\" + ano + ".txt";
        try{
            file = new BufferedReader(new FileReader(filePath));
        }
        catch(FileNotFoundException exWindows){
            filePath = "src/SAToDA/" + ano + ".txt";
            try{
                file = new BufferedReader(new FileReader(filePath));
            }
            catch(FileNotFoundException exLinux){
                error = "Nao foi possivel encontrar o arquivo " + filePath;
                logger.error(error);
                throw exLinux;
            }
        }
        /*
         *Este loop percorre o arquivo que contém a relação de todos os
         *cursos oferecidos no catálogo. Esta relação contém um curso por linha
         *contendo primeiro o código do curso, separado por um espaço do nome do cruso
        */
        aux = null;
        try{
            aux = file.readLine();
        }
        catch(IOException ex){
            error = "Ocorreu um problema ao tentar ler " + filePath;
            logger.error(error);
            throw ex;
        }
        while(aux != null){
            i = aux.indexOf(' ');
            codigoDoCurso = Integer.parseInt(aux.substring(0,i));
            nomeDoCurso = aux.substring(i+1);
            curso = new Curso(codigoDoCurso,nomeDoCurso);
            this.cursos.add(curso);
            try{
            aux = file.readLine();
            }
            catch(IOException ex){
                error = "Ocorreu um problema ao tentar ler " + filePath;
                logger.error(error);
                throw ex;
            }
        }
    }
    
    /**
     * Retorna o ano do catálogo
     * @return Ano do catalogo
     */
    public String getNome() {
        return this.ano;
    }
    

    /**
     * @return Retorna o numero de cursos que o catálogo contém
     */
    public int numDiscs() {
        return cursos.size();
    }
    
    /**
     *@return Retorna os cursos oferecidos no catálogo
     */
        public ArrayList<Curso> getCursos() {
        return this.cursos;
    }
}

